﻿//---------------------------------------------------------------
// 변수.
//---------------------------------------------------------------
var g_bStart:Boolean = false;				// 게임이 시작했는지..
var g_nPlayer:Number = 1;					// 현재 플레이어가 누구인지..
var g_nClick:Number = 0;						// 애니메이션이 진행중인지..(진행중 클릭 안되게 설정하기위해..)
var g_nClickShow:Number = 0;				// 양쪽 모두 둘 수 없는 경우를 체크하기 위한 변수.
var g_nStartX:Number = 45;					// 바둑알을 놓을 시작 위치
var g_nStartY:Number = 105;
var g_nSize:Number = 8;						// 가로, 세로 바둑판 사이즈
var g_nDepth:Number = 0;					// 생성되는 바둑알의 깊이(겹치는 우선순위)
var g_aChkBaduk:Array = Array(8);		// 클릭한 지점의 8방으로 상대방의 바둑알이 있는지 체크할 배열

//---------------------------------------------------------------
// 함수.
//---------------------------------------------------------------
// 바둑알 클릭시 연주될 효과음을 불러온다.
//var mySound:Sound = new Sound();
//mySound.attachSound("Click");

// 바둑알 및 기타 객체들을 생성한다.
FuncCreateBaduk = function()
{
	// 바둑알 및 클릭가능한 지점 복사.
	for(var i = 1; i<=g_nSize; i++) 						// 바둑판의 세로 8칸..
	{
		for(var m = 1; m<=g_nSize; m++)				// 바둑판의 가로 8칸만큼..
		{
			// 바둑알 복사.
			duplicateMovieClip(baduk, "Baduk_"+i+"_"+m, g_nDepth++);
			eval("Baduk_"+i+"_"+m)._x = g_nStartX + (m-1)*50;
			eval("Baduk_"+i+"_"+m)._y = g_nStartY + (i-1)*50;
			eval("Baduk_"+i+"_"+m).x = i;					// 자기 자신의 좌표값을 지정해준다.
			eval("Baduk_"+i+"_"+m).y = m;
			
			// i_show 복사.
			duplicateMovieClip(i_show, "Show_"+i+"_"+m, g_nDepth++);
			eval("Show_"+i+"_"+m)._x = g_nStartX + (m-1)*50;
			eval("Show_"+i+"_"+m)._y = g_nStartY + (i-1)*50;
			
			// 바둑알 마우스 클릭 함수 지정.
			eval("Baduk_"+i+"_"+m).onRelease = function()
			{
				trace("Start : " + this);
				
				// 네트워크 모드일 경우, 자기 자신의 차례가 아니면 건너뛴다.
				if(g_bNetworkMode)
				{
					if(!g_bConnectBoth) {trace("다른 플레이어가 접속하지 않았습니다."); return;}
					if(g_bSelfClick) 
					{
						if(g_nNetworkPlayer != g_nPlayer) {trace("다른 플레이어의 차례입니다."); return;}
						else g_server.send("<game player=" + "\"" + g_nNetworkPlayer + "\"" + 
										   							" x=" + "\"" + this.x + "\"" + 
																	" y=" + "\"" + this.y + "\"" + " />");
					}else
					{
						if(g_nClick == 0) 
						{
							FuncClick(this.x, this.y, g_nPlayer, this, true);		// 버튼을 클릭하고,
							FuncShowNextPlayer(g_nPlayer);						// 누구차례인지 보여준다.
							FuncUpdateScore();												// 스코어를 보여준다.
							FuncShowClickable();											// 둘 수 있는 곳을 보여준다.
							g_bSelfClick = true;
						}
					}
				}else
				{
					if(g_nClick == 0) 
					{
						FuncClick(this.x, this.y, g_nPlayer, this, true);		// 버튼을 클릭하고,
						FuncShowNextPlayer(g_nPlayer);						// 누구차례인지 보여준다.
						FuncUpdateScore();												// 스코어를 보여준다.
						FuncShowClickable();											// 둘 수 있는 곳을 보여준다.
					}
				}
				trace("End \r");
			}
		}
	}

	// 사용하지 않는 원본 무비클립은 애니메이션을 중지시킨다.
	i_show.gotoAndStop(1);
	
	// 기타 객체 복사.
	duplicateMovieClip(dup_turn, "i_turn", g_nDepth++);
	i_turn._x = 150;
	i_turn._y = 270;
	
	duplicateMovieClip(dup_GameOver, "i_GameOver", g_nDepth++);
	i_GameOver._x = 20;//250;
	i_GameOver._y = 245;//255;
	i_GameOver._alpha = 100;
	dup_GameOver._visible = false;
	i_GameOver.onRelease = function()
	{
		g_server.send("<replay>" + g_nNetworkPlayer + "</replay>");
		FuncReplay();
	}
}
// 리플레이할 수 있도록 처음으로 되돌린다.
FuncReplay = function()
{
	FuncInit();												// 데이터를 초기화한다.
	FuncShowNextPlayer(g_nPlayer);		// 누구차례인지 보여준다.
	FuncUpdateScore();								// 스코어를 보여준다.
	FuncShowClickable();							// 둘 수 있는 바둑알을 표시한다.
}
// 초기화를 진행한다.
FuncInit = function()
{
	for(var i = 1; i<=g_nSize; i++) 						// 바둑판의 세로 8칸..
	{
		for(var m = 1; m<=g_nSize; m++)				// 바둑판의 가로 8칸만큼..
		{
			eval("Baduk_"+i+"_"+m).gotoAndStop(1);	// 빈 바둑알로 만든다.
			eval("Baduk_"+i+"_"+m).player = 0;		// 플레이어 번호를 0으로 두어 빈 바둑알로 설정.
			eval("Baduk_"+i+"_"+m).trans = true;		// 애니메이션이 끝나면 애니메이션 되는 바둑알의 개수를
																		// 감소시킬 수 있도록 설정한다.(새로 두는 경우는 false)			
			// i_show 복사.
			//eval("Show_"+i+"_"+m).gotoAndStop(1);
		}
	}
	// 초기 바둑알 생성. (4, 4), (4, 5), (5, 4), (5, 5)는 미리 생성한다.
	FuncClick(0, 0, 1, eval("Baduk_"+4+"_"+4));	// 1번 플레이어의 돌로 설정.
	FuncClick(0, 0, 2, eval("Baduk_"+4+"_"+5));	// 2번 플레이어의 돌로 설정.
	FuncClick(0, 0, 2, eval("Baduk_"+5+"_"+4));	// 2번 플레이어의 돌로 설정.
	FuncClick(0, 0, 1, eval("Baduk_"+5+"_"+5));	// 1번 플레이어의 돌로 설정.

	var g_nPlayer = 1;								// 현재 플레이어를 1번으로 설정.
	var g_nClick = 0;									// 애니메이션이 진행중인지..(진행중 클릭 안되게 설정하기위해..)
	var g_nClickShow = 0;							// 양쪽 모두 둘 수 없는 경우를 체크하기 위한 변수.
	
	i_turn.gotoAndStop(1);							// 턴 넘어가는 애니메이션을 보이지 않도록 설정.
	i_GameOver._visible = false;					// 게임오버 버튼을 보이지 않도록 설정.
}
// 빈 바둑알을 클릭했을 때 실행할 함수.
FuncClick = function(x:Number, y:Number, player:Number, mc:MovieClip, clk:Boolean)
{								// 좌표X, 좌표y, 플레이어넘버, 바둑알무비클립, 실제클릭인지(체크용인지)..
	if(mc.player == 0)				// 빈 바둑알 일 경우에만 실행한다.
	{
		if( x == 0 && y == 0) 		// 좌표값으로 (0, 0)이 들어오면 바로 바둑알을 생성한다.
		{
			mc.trans = false;		// 바둑알이 새로 생성되는 곳이므로 
											// 애니메이션되는 바둑알의 개수를 감소시키지 않도록 한다.
			mc.gotoAndStop(FuncGetFrame(player));		// 해당 플레이어의 프레임으로 이동(바둑알모양설정)
			mc.player = player;											// 해당 바둑알의 소유주를 해당 플레이어로 설정.
			g_nPlayer = 1;			// 이 모드는 초기 바둑알 생성시 사용되므로 플레이어 시작번호는 1번으로 고정.
											// 게임 진행중 사용시에는 재귀함수 종료 후 재설정되므로 무시가능.
		}
		else if( x > 0 && y > 0)	// 빈 바둑알을 클릭하였을 경우,
		{
			FuncFindBaduk(x, y, player);		// 현재 바둑알 주변 8방으로 상대방의 바둑알이 있는지 체크한다.
			var can = 0;									// 현재 바둑알을 놓아도 되는지 체크할 변수는 우선 불가능으로 설정.
			for(var i:Number = 0; i<	g_aChkBaduk.length; i++)		// 8방으로 모두 체크하면서...
			{
				if(g_aChkBaduk[i] == 1) 										// 상대방 바둑알이 있는 방향이라면...
					if(FuncFindBadukOP(x, y, player, i, clk) == true) can = 1;		// 더 진행하여 오델로가 성립하는지
																											// 체크하고 성립하면,  현재 바둑알을
																											// 놓을 수 있도록 can 을 1로 설정.
			}
			if(can == 1) 									// 오델로가 성립하면 현재 빈 바둑알을 플레이어의 바둑알로 바꾼다.
			{
				if(clk)	// 실제 클릭한 경우라면, false면 체크용이므로 무시한다.
				{
//					mySound.start();					// 효과음을 연주한다.
					FuncClick(0, 0, player, mc);		// 바둑알을 바꾸기 위하여 재귀함수로 (0, 0)을 사용한다.
					g_nPlayer = FuncOP(player);	// 다음 플레이어의 번호를 바꾼다.
				}else
				{
					return true;		// 놓을 수 있는 자리임을 알리기 위하여 true를 반환한다.
				}
			}
		}
		else trace("[FuncClick] "+"Unknown Coord : " + x + ", " + y);
	}
}
// 해당 좌표의 바둑알을 애니메이션시켜 상대방의 바둑알로 변환한다.
FuncChangeBaduk = function(x:Number, y:Number)
{
	g_nClick++;													// 애니메이션 되고 있는 바둑알의 개수를 증가시킨다.
	eval("Baduk_"+x+"_"+y).trans = true;				// 애니메이션이 끝나면 애니메이션 되는 바둑알의 개수를
																		// 감소시킬 수 있도록 설정한다.
	eval("Baduk_"+x+"_"+y).play();						// 애니메이션을 진행한다.(다른 바둑알로 변환한다.)
	eval("Baduk_"+x+"_"+y).player = FuncOP(eval("Baduk_"+x+"_"+y).player);		// 바둑알의 소유주를 바꾼다.
}
// 해당 좌표의 바둑알 주변 8방으로 상대방의 바둑알이 있는지 체크한다.
FuncFindBaduk = function(x:Number, y:Number, player:Number)	
{	// 상대방의 바둑알이 있으면 1, 없으면 0으로 설정한다.
	FuncInitArray(g_aChkBaduk);								// 배열 초기화.
	if(eval("Baduk_"+(x-1)+"_"+(y-1)).player == FuncOP(player)) g_aChkBaduk[0] = 1;
	if(eval("Baduk_"+(x-1)+"_"+(y)).player == FuncOP(player)) g_aChkBaduk[1] = 1;
	if(eval("Baduk_"+(x-1)+"_"+(y+1)).player == FuncOP(player)) g_aChkBaduk[2] = 1;
	if(eval("Baduk_"+(x)+"_"+(y-1)).player == FuncOP(player)) g_aChkBaduk[3] = 1;
	if(eval("Baduk_"+(x)+"_"+(y+1)).player == FuncOP(player)) g_aChkBaduk[4] = 1;
	if(eval("Baduk_"+(x+1)+"_"+(y-1)).player == FuncOP(player)) g_aChkBaduk[5] = 1;
	if(eval("Baduk_"+(x+1)+"_"+(y)).player == FuncOP(player)) g_aChkBaduk[6] = 1;
	if(eval("Baduk_"+(x+1)+"_"+(y+1)).player == FuncOP(player)) g_aChkBaduk[7] = 1;
	//FuncShowArray(g_aChkBaduk);
}
// 해당 좌표의 바둑알을 기준으로 lineNum방향으로 오델로가 성립하는지 체크하고 성립하면 돌을 바꾼다.
FuncFindBadukOP = function(x:Number, y:Number, player:Number, lineNum:Number, clk:Boolean)
{
	var offset:Number = 2;		// lineNum 방향으로 몇칸 진행해서 확인해야하는지 체크..
	switch(lineNum)				// 1번칸은 FuncFindBaduk()에서 확인됐으므로 건너뛰고 체크를 시작한다.
	{
		case 0:
			while(true)
			{	// 해당 좌표를 기준으로 offset만큼 떨어진 칸의 바둑알의 소유주가 상대방인지 체크하고
				// 상대방이 맞다면 offset을 증가하여 그 다음칸을 체크할 수 있도록 한다.
				if(eval("Baduk_"+(x-offset)+"_"+(y-offset)).player == FuncOP(player)) offset++;
				// 소유주가 자기자신이라면 오델로가 성립하는 것이므로 그 사이에 있는 돌을 모두 바꾼다.
				else if(eval("Baduk_"+(x-offset)+"_"+(y-offset)).player == player) 
				{
					if(clk)				// 실제 클릭일 경우, false면 체크용이므로 돌을 바꾸지 않는다.
					{
						for(var i:Number = 1; i<offset; i++)		// 해당 좌표를 기준으로 1칸부터 offset-1칸까지의 돌을
						{														// 자기것으로 바꾼다. 
																				// 여기까지 왔다는 것은 자기자신과 offset위치의 칸은
							FuncChangeBaduk(x-i, y-i);			// 입력한 좌표의 돌을 바꾼다.
						}
					}
					return true;										// 돌을 바꿨으면 true를 리턴하여 오델로가 성립하였음을
				}															// 알린다.
				else { break; }		// 오델로가 성립하지 않았으면, 종료한다.
			}
		break;
		case 1:
			while(true)
			{
				if(eval("Baduk_"+(x-offset)+"_"+(y)).player == FuncOP(player)) offset++;
				else if(eval("Baduk_"+(x-offset)+"_"+(y)).player == player) 
				{
					if(clk)
					{
						for(var i:Number = 1; i<offset; i++)
						{
							FuncChangeBaduk(x-i, y);
						}
					}
					return true;
				}
				else { break; }
			}
		break;
		case 2:
			while(true)
			{
				if(eval("Baduk_"+(x-offset)+"_"+(y+offset)).player == FuncOP(player)) offset++;
				else if(eval("Baduk_"+(x-offset)+"_"+(y+offset)).player == player) 
				{
					if(clk)
					{
						for(var i:Number = 1; i<offset; i++)
						{
							FuncChangeBaduk(x-i, y+i);
						}
					}
					return true;
				}
				else { break; }
			}
		break;
		case 3:
			while(true)
			{
				if(eval("Baduk_"+(x)+"_"+(y-offset)).player == FuncOP(player)) offset++;
				else if(eval("Baduk_"+(x)+"_"+(y-offset)).player == player) 
				{
					if(clk)
					{
						for(var i:Number = 1; i<offset; i++)
						{
							FuncChangeBaduk(x, y-i);
						}
					}
					return true;
				}
				else { break; }
			}
		break;
		case 4:
			while(true)
			{
				if(eval("Baduk_"+(x)+"_"+(y+offset)).player == FuncOP(player)) offset++;
				else if(eval("Baduk_"+(x)+"_"+(y+offset)).player == player) 
				{
					if(clk)
					{
						for(var i:Number = 1; i<offset; i++)
						{
							FuncChangeBaduk(x, y+i);
						}
					}
					return true;
				}
				else { break; }
			}
		break;
		case 5:
			while(true)
			{
				if(eval("Baduk_"+(x+offset)+"_"+(y-offset)).player == FuncOP(player)) offset++;
				else if(eval("Baduk_"+(x+offset)+"_"+(y-offset)).player == player) 
				{
					if(clk)
					{
						for(var i:Number = 1; i<offset; i++)
						{
							FuncChangeBaduk(x+i, y-i);
						}
					}
					return true;
				}
				else { break; }
			}
		break;
		case 6:
			while(true)
			{
				if(eval("Baduk_"+(x+offset)+"_"+(y)).player == FuncOP(player)) offset++;
				else if(eval("Baduk_"+(x+offset)+"_"+(y)).player == player) 
				{
					if(clk)
					{
						for(var i:Number = 1; i<offset; i++)
						{
							FuncChangeBaduk(x+i, y);
						}
					}
					return true;
				}
				else { break; }
			}
		break;
		case 7:
			while(true)
			{
				if(eval("Baduk_"+(x+offset)+"_"+(y+offset)).player == FuncOP(player)) offset++;
				else if(eval("Baduk_"+(x+offset)+"_"+(y+offset)).player == player) 
				{
					if(clk)
					{
						for(var i:Number = 1; i<offset; i++)
						{
							FuncChangeBaduk(x+i, y+i);
						}
					}
					return true;
				}
				else { break; }
			}
		break;
		default:
			trace("Invalid LineNumber : " + lineNum);
		break;
	}
	return false;
}
// 상대방 플레이어의 번호를 얻는다. 1->2, 2->1 (if문을 최대한 줄이기 위해서 사용.)
FuncOP = function(player:Number)
{
	if(player == 1) return 2;
	else return 1;
}
// 플레이어에 따른 시작 프레임 얻기.(바둑알을 놓을때 사용.)
FuncGetFrame = function(player:Number)
{
	if(player == 1) return 2;
	else return  21;
}
// 입력으로 들어온 배열을 초기화한다.
FuncInitArray = function(ary:Array)
{
	for(var i:Number = 0; i<ary.length; i++)
	{
		ary[i] = 0;
	}
}
// 입력으로 들어온 배열의 값을 출력시킨다.
FuncShowArray = function(ary:Array)
{
	trace("Total Length : " + ary.length);
	for(var i:Number = 0; i<ary.length; i++)
	{
		trace(i +" : "+ ary[i]);
	}
}
// 다음 플레이어가 누구인지 보여줍니다.
FuncShowNextPlayer = function(player:Number)
{
	baduk.gotoAndStop(FuncGetFrame(player));
}
// 놓을 수 있는 자리가 어디인지 보여줍니다.
FuncShowClickable = function()
{
	var howMuch:Number = 0;
	for(var i = 1; i<=g_nSize; i++) 								// 바둑판의 세로 8칸..
	{
		for(var m = 1; m<=g_nSize; m++)						// 바둑판의 가로 8칸만큼..
		{
			eval("Show_"+i+"_"+m).gotoAndStop(1);			// 둘 수 있는 표시는 모두 안보이게 설정하고
			if( FuncClick(i, m, g_nPlayer, eval("Baduk_"+i+"_"+m), false) == true)		// 둘 수 있는 곳이면,
			{
				eval("Show_"+i+"_"+m).gotoAndPlay(2);		// 보이도록 설정한다.
				howMuch++;												//  둘 수 있는 바둑알이 몇개인지 지정한다.
				g_nClickShow = 0;									// 0이면, 바둑알을 둘 곳이 있음을 알리게 된다.
			}
		}
	}
	if( howMuch == 0 ) 									// 둘 수 있는 곳이 없을 경우,
	{
		g_nClickShow++;									// 1이상이면, 바둑알을 둘 곳이 없을을 알리게 된다.
		if(g_nClickShow > 1)								// 1보다 커지면, 양쪽 모두 둘 곳이 없는 것이므로  
		{
			FuncGameOver();								// 게임을 종료한다.
			return;												// 함수도 종료한다.
		}
		i_turn.play();											// 턴이 넘어감을 알려주는 애니메이션을 진행한다.
		g_nPlayer = FuncOP(g_nPlayer);			// 턴을 넘긴다.
		FuncShowNextPlayer(g_nPlayer);		// 누구차례인지 보여준다.
		FuncShowClickable();							// 둘 수 있는 바둑알을 표시한다.
	}
}
// 스코어를 업데이트 시킨다.
FuncUpdateScore = function()
{
	var score_P1:Number = 0;
	var score_P2:Number = 0;
	
	for(var i = 1; i<=g_nSize; i++) 								// 바둑판의 세로 8칸..
	{
		for(var m = 1; m<=g_nSize; m++)						// 바둑판의 가로 8칸만큼..
		{
			if( eval("Baduk_"+i+"_"+m).player == 1 ) score_P1++;
			else if( eval("Baduk_"+i+"_"+m).player == 2 ) score_P2++;
		}
	}
	if(score_P1 < 10)	i_scoreP1.text = "0" + score_P1.toString();
	else i_scoreP1.text = score_P1.toString();
	if(score_P2 < 10)	i_scoreP2.text = "0" + score_P2.toString();
	else i_scoreP2.text = score_P2.toString();
}
// 게임 종료시 다시 게임을 시작할 것인지 묻는다.
FuncGameOver = function()
{
	g_bConnectBoth = false;
	i_GameOver._visible = true;				// 게임오버 버튼을 보이도록 설정한다.
}
//---------------------------------------------------------------
// Main.
//---------------------------------------------------------------
FuncCreateBaduk();								// 바둑알을 생성한다.
FuncInit();												// 변수들을 초기화한다.
FuncShowNextPlayer(g_nPlayer);		// 누구차례인지 보여준다.
FuncUpdateScore();								// 스코어를 보여준다.
FuncShowClickable();							// 둘 수 있는 바둑알을 표시한다.
